#include"1.20.h"

using namespace std;
int main00 ()
{
    //函数指针实现计算器
    double n1, n2;
    char op;
    //定义一个函数指针
    //double(*ptrcalc)(double,double) = NULL;
    auto ptrcalc = add;//auto自动判断类型,不知道咋回事儿不能用...
                       //知道了，auto要初始化才能判断类型NULL无法判断
    //double result;
    cout << "请输入想要完成的操作式：";
    cin >> n1 >> op >> n2;
    switch(op)
    {
        case '+':
            //调用加法函数
            //result = add(n1, n2);
            //调用函数指针
            ptrcalc = add;
            break;
        case '-':
            ptrcalc = sub;
            break;
        case '*':
            ptrcalc = mul;
            break;
        case '/':
            ptrcalc = div;
            break;
    }
    //cout << result << endl;
    //调用打印函数
    print_result(ptrcalc, n1, n2);
    return 0;
}

void swap(int& n1,int& n2)
{
    int temp = n1;
    n1 = n2;
    n2 = temp;
}
void show(const int& n1,const int& n2)//不想引用值被修改，使用const
{
    cout << "n1=" << n1 << "\t" << "n2=" << n2 << endl;
}
int main2 ()
{
    int n1 = 2, n2 = 5;
    //用引用实现交换
    swap(n1, n2);
    //cout << "n1=" << n1 << "\t" << "n2=" << n2 << endl;
    show(n1, n2);
    return 0;
}

// int & sum()//返回引用类型
// {
//     int n = 10;
//     int &rn = n;
//     return rn;//返回的是局部引用变量//error
// }

// int main()
// {
//     int &n = sum();
//     cout << "n=" << n << endl;
//     return 0;
// }

//没有明确返回值时，默认返回最后一个更新的参数(vs不可以，会报错)
// int &func(int& n1,int& n2)
// {
//     n1++;
//     n2++;
//     //return n1 + n2;//error返回引用时，必须是参数的其中一个
// }
// int main ()
// {
//     int n1 = 10;
//     int n2 = 5;
//     // int &s = func(n1, n2);
//     // cout << s << endl;
//     return 0;
// }

//内联函数（inline) -> 替换
//在声明或定义的时候前面加关键字（inline）
inline void func()
{
    cout << 1 << endl;
}

int main3()
{
    func();
    return 0;
}

//默认参数
//在函数声明或者实现中任选其一，但是不可以两个地方都有
//多个参数时，只能从后往前设置默认参数（不能出现 前一个参数有默认值而后一个没有 的情况）
void func(int n1,int n2=5)
{
    cout << n1 << '\t' << n2 << endl;
}
int main4 ()
{
    func(1);
    func(1,3);
    return 0;
}

//函数重载（overloding)，编译器在编译时，根据参数列表对函数进行重命名再进行调用（重载决议）
//函数名相同，参数列表不同（int 和 in& 编译时相同）
//排序不同类型数组
// void show (int arr[],int len)
// {
//     for (int i = 0; i < len;i++)
//         cout << arr[i] << " " ;
//     cout << endl;
// }
// void sort (int arr[],int len)
// {
//     for (int i = 0; i < len - 1;i++)
//        for (int j = 0; j < len - 1 - i;j++)
//             if(arr[j]>arr[j+1])
//             {
//                 int temp = arr[j];
//                 arr[j] = arr[j + 1];
//                 arr[j + 1] = temp;
//             }
// }
// void show (float arr[],int len)
// {
//     for (int i = 0; i < len;i++)
//         cout << arr[i] << " " ;
//     cout << endl;
// }
// void sort (float arr[],int len)
// {
//     for (int i = 0; i < len - 1;i++)
//        for (int j = 0; j < len - 1 - i;j++)
//             if(arr[j]>arr[j+1])
//             {
//                 float temp = arr[j];
//                 arr[j] = arr[j + 1];
//                 arr[j + 1] = temp;
//             }
// }

//函数模版
template <typename T>//typename和class都可以，class是早期写法,T只在函数内部有效
void sort(T arr[], int len);//声明
template <typename T>
void sort(T arr[], int len)
{
    for (int i = 0; i < len - 1;i++)
       for (int j = 0; j < len - 1 - i;j++)
            if(arr[j]>arr[j+1])
            {
                T temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
}
template <class T>
void show(T arr[], int len)
{
    for (int i = 0; i < len;i++)
        cout << arr[i] << " " ;
    cout << endl;
}

int main ()
{
    int arri[] = {37, 24, 33, 48, 58, 83, 34};
    float arrf[] = {78.3f, 23.3f, 57.3f, 77.9f, 22.1f};
    double arrd[] = {33.4, 55.6, 23.4, 76.5, 37.6, 87.4, 21.1};
    string arrs[] = {"关羽", "张飞", "刘备"};

    cout << "排序前：";
    show(arri, sizeof(arri)/sizeof(arri[0]));
    sort(arri, sizeof(arri)/sizeof(arri[0]));
    cout << "排序后：";
    show(arri, sizeof(arri)/sizeof(arri[0]));

    cout << "排序前：";
    show(arrf, sizeof(arrf)/sizeof(arrf[0]));
    sort(arrf, sizeof(arrf)/sizeof(arrf[0]));
    cout << "排序后：";
    show(arrf, sizeof(arrf)/sizeof(arrf[0]));

    show(arrs, sizeof(arrs)/sizeof(arrs[0]));

    return 0;
}
int main111()
{
    auto n = 1;
    cout << n << endl;
    return 0;
}
